﻿using System;
using System.Data;
using System.Data.Common;

namespace AT.IBMS.Framework.Data
{
    public partial class DataProvider
    {

        /// <summary>
        /// 执行 DbCommand，并返回 IDataReader。
        /// </summary>
        /// <param name="command">要执行的 DbCommand。</param>
        /// <param name="transaction">执行命令时的事务。</param>
        /// <param name="parameters">DbParameter 对象的集合。</param>
        /// <returns>一个 IDataReader 对象。</returns>
        public virtual IDataReader ExecuteReader(
            DbCommand command,
            DbTransaction transaction = null,
            params DbParameter[] parameters
            )
        {

            foreach (DbParameter parameter in parameters)
            {
                command.Parameters.Add(parameter);
            }

            if (transaction == null)
            {
                return database.ExecuteReader(command);
            }
            else
            {
                return database.ExecuteReader(command, transaction);
            }

        }

        /// <summary>
        /// 执行 CommandText，并返回 IDataReader。
        /// </summary>
        /// <param name="commandText">针对数据源运行的文本命令。</param>
        /// <param name="commandType">指示或指定如何解释 CommandText 属性。</param>
        /// <param name="transaction">执行命令时的事务。</param>
        /// <param name="parameters">DbParameter 对象的集合。</param>
        /// <returns>一个 IDataReader 对象。</returns>
        public virtual IDataReader ExecuteReader(
            string commandText,
            CommandType commandType = CommandType.Text,
            DbTransaction transaction = null,
            params DbParameter[] parameters
            )
        {

            DbCommand command;

            command = CreateCommand(commandText, commandType);
            return ExecuteReader(command, transaction, parameters);
        }

        /// <summary>
        /// 启动此 DbCommand 描述的 SQL 语句或存储过程的异步执行，并从服务器中检索一个或多个结果集。
        /// </summary>
        /// <param name="command">要执行的 DbCommand。</param>
        /// <param name="callback">命令执行完成时调用的 AsyncCallback 委托。 传递 Nothing（在 Microsoft Visual Basic 中为 Nothing）以指示不需要回调。</param>
        /// <param name="state">传递到回调过程的用户定义的状态对象。使用 AsyncState 属性从回调过程内检索此对象。</param>
        /// <param name="transaction">执行命令时的事务。</param>
        /// <param name="parameters">DbParameter 对象的集合。</param>
        /// <returns>可用于轮询和/或等待结果的 IAsyncResult；当调用 EndExecuteReader（返回一个可用于检索返回行的 SqlDataReader 实例）时，也需要该值。</returns>
        public virtual IAsyncResult BeginExecuteReader(
            DbCommand command, 
            AsyncCallback callback, 
            object state, 
            DbTransaction transaction = null, 
            params DbParameter[] parameters
            )
        {

            foreach (DbParameter parameter in parameters)
            {
                command.Parameters.Add(parameter);
            }

            if (transaction == null)
            {
                return database.BeginExecuteReader(command, callback, state);
            }
            else
            {
                return database.BeginExecuteReader(command, transaction, callback, state);
            }

        }

        /// <summary>
        /// 启动此 DbCommand 描述的 SQL 语句或存储过程的异步执行，并从服务器中检索一个或多个结果集。
        /// </summary>
        /// <param name="commandText">针对数据源运行的文本命令。</param>
        /// <param name="callback">命令执行完成时调用的 AsyncCallback 委托。 传递 Nothing（在 Microsoft Visual Basic 中为 Nothing）以指示不需要回调。</param>
        /// <param name="state">传递到回调过程的用户定义的状态对象。使用 AsyncState 属性从回调过程内检索此对象。</param>
        /// <param name="commandType">指示或指定如何解释 CommandText 属性。</param>
        /// <param name="transaction">执行命令时的事务。</param>
        /// <param name="parameters">DbParameter 对象的集合。</param>
        /// <returns>可用于轮询和/或等待结果的 IAsyncResult；当调用 EndExecuteReader（返回一个可用于检索返回行的 SqlDataReader 实例）时，也需要该值。</returns>
        public virtual IAsyncResult BeginExecuteReader(
            string commandText,
            AsyncCallback callback,
            object state, 
            CommandType commandType = CommandType.Text,
            DbTransaction transaction = null,
            params DbParameter[] parameters
            )
        {
            DbCommand command;

            command = CreateCommand(commandText, commandType);
            return BeginExecuteReader(command, callback, state, transaction, parameters);
        }

        /// <summary>
        /// 完成 SQL 语句的异步执行，返回请求的 IDataReader。
        /// </summary>
        /// <param name="asyncResult">由调用 BeginExecuteReader 返回的 IAsyncResult。</param>
        /// <returns>可用于检索请求行的 IDataReader 对象。</returns>
        public virtual IDataReader EndExecuteReader(IAsyncResult asyncResult)
        {
            return database.EndExecuteReader(asyncResult);
        }

    }
}
